前面你学了造路由器的两条路:拆 OpenWRT(Phase 2)、用 NixOS 声明式(3.2)。这章读第三种——Landscape Router,一个用 Rust + eBPF 写的开源项目。它的定位很有意思:不像 OpenWRT 是整个发行版、也不像 NixOS 要你全盘声明式,而是一个装在你已经熟悉的 Linux 发行版(Debian/Arch/openSUSE)之上的路由器管理层。更关键的是它的技术选择:用 eBPF 做数据面(NAT、分流),而不是你在 1.3 学的 nftables。这章不教你用它,而是用你 Phase 0–3.2 建立的整套框架去解构它的设计——你会发现它把你学过的东西(尤其 2.7 那些"高级功能")用一种更现代的方式实现了。它是 Rust 写的,对你在学 Rust 也是个好读物。
Landscape 在活跃开发中(本文写作时最新版 v0.18.x),细节可能变化。下面的分析基于其公开设计(仓库 github.com/ThisSeanZhang/landscape),重点是"用你的框架怎么读一个真实路由器项目",而非逐字复述功能列表。看到时以官方文档为准。
1Landscape 是什么:第三种路线
Landscape 不替换你的操作系统——它是一个跑在你现有 Linux 上的后端二进制(landscape-webserver)+ 一套 Web UI,把这台机器配置成路由器。作者的动机很直接:想继续用自己熟悉的发行版当路由器,而不是被锁进某个专用系统(已知 Debian、Arch、openSUSE 都能跑;因为重度依赖 eBPF,需要较新内核 6.9+)。对比你学的两条路,这是第三个位置:
它对 3.1"持久化问题"的答案也不同:不是 NixOS 那种声明式不可变,而是所有配置集中在一个目录(/root/.landscape-router)——换新版本直接跑、启动时自动迁移旧配置、需要时支持降级。一种"自包含 + 可迁移 + 可版本化"的思路。
把 Linux 变路由器:OpenWRT 说"用我这套打磨好的专用系统",NixOS 说"把整机写成声明",Landscape 说"留着你熟的系统,我做上面那层"。没有对错,是不同取舍——而你现在有框架去评判每一种的得失。
2关键选择:eBPF 数据面
Landscape 最大的技术特点是用 eBPF 在内核里处理数据包(NAT、分流),而不是你在 1.3 学的 nftables 规则。先一分钟说 eBPF:它让你把一段受限的程序安全地加载进内核、挂在某些钩子上(比如网卡收发包的 TC/XDP 挂载点),包一到就运行你的代码——相当于"给内核热插一段自定义的包处理逻辑",不用改内核、不用装内核模块。
Landscape 为什么用它而不是 nftables:性能(eBPF 直接在内核数据路径上跑,直连流量几乎零额外开销——这正是它的宣传点);可编程(复杂分流:按源 IP/MAC、目的 IP/域名/Geo 规则匹配,用 eBPF 比堆 nftables 规则更灵活);精细控制(对不同流量做不同 NAT 行为,下一节)。它的仓库结构也能看出这个分工:
landscape/
├── landscape-ebpf/ # eBPF 程序(数据面:NAT、分流)— 含 C 代码
├── landscape-dns/ # DNS 服务(按流 DNS、缓存)
├── landscape-gateway/ # 网关核心逻辑
├── landscape-database/ # 配置存储
├── landscape-webserver/ # 后端 + REST API
├── landscape-webui/ # Vue 前端
└── ...
这深化你对 1.3 的理解:nftables 是一种在内核里处理包的方式(声明规则,由 netfilter 执行);eBPF 是另一种(直接注入程序,挂钩子上跑)。1.3 你用 nftables 做 NAT/过滤、2.7 你用"nftables 打标 → ip rule → 隧道"做策略路由。Landscape 做的是同一类事,但把数据面换成了 eBPF——它证明 2.7 说的"高级功能 = 原语的组合"可以换底座:同样是"打标 + 分流",可以用 nftables+ip rule(OpenWRT 那套),也可以用 eBPF(Landscape 这套)。原理不变,底座可换。
3用你的框架读它的功能
Landscape 的每个功能,你都能对到学过的概念——这就是"用框架读项目"的价值:
-
精细 NAT↔ 0.6默认给更严格的 NAT4 行为(安全),但允许对特定 IP/域名放宽到 NAT1(如需 P2P 打洞的 BT/PT)。回想 0.6 的 NAT 类型(Full-Cone 宽松利于 P2P vs Symmetric 更严)——Landscape 把 0.6 的 NAT 行为做成了"可按流量选择"的策略维度。
-
按流 DNS↔ 2.3 / 2.7不同流量有各自的 DNS 配置和缓存,避免不同分流策略共用一个缓存导致串味。2.3 你学 dnsmasq 转发缓存、2.7 学按域名分上游——这是它俩的精细化版本(per-flow,而非全局一个缓存)。
-
流量重定向进 Docker 容器 + TProxy↔ 2.7 / 1.4用 eBPF 把选定流量重定向进一个 Docker 容器,容器里跑 TProxy 程序处理。这是 2.7 的透明代理 + 1.4 的容器(namespace)隔离的组合——代理组件跑在容器里,坏了也不拖垮直连(它的设计原则:直连流量不被代理故障连累)。
-
Geo 规则分流↔ 2.7用 Geo 数据库(国家/地区级)匹配目的地做分流决策。还是 2.7"按目的地选择怎么走"的思路,只是匹配维度更丰富(域名/IP/Geo)。
看到没有?你不需要从头读 Landscape 的文档——你一眼就能把它每个功能对到自己学过的概念:精细 NAT↔0.6、按流 DNS↔2.3/2.7、TProxy 进容器↔2.7/1.4、Geo 分流↔2.7。这就是这门课给你的:面对任何真实路由器项目,你能快速解构它、判断它的设计、挑出它和别的方案的取舍差异。你从"不懂就只能抄配置"变成了"看得穿地评估一个项目"。
4三种路线对比
三个项目,同一个目标,三种取舍。把它们放一起,你就有了选型的判断力:
| 维度 | OpenWRT | NixOS | Landscape |
|---|---|---|---|
| 系统定位 | 专用发行版(替换系统) | 声明式发行版(替换系统) | 管理层(装在现有发行版上) |
| 配置方式 | UCI(集中配置文件) | 声明式(整机一份声明) | Web UI + 单目录配置 |
| 数据面 | nftables / 内核 | nftables / 内核 | eBPF(TC/XDP) |
| 持久化答案 | UCI + 备份 | 声明即系统(不可变 + 回滚) | 单目录 + 启动自动迁移 + 可降级 |
| 硬件 / 内核 | 嵌入式友好、旧内核也行 | 通用 Linux | 需较新内核(6.9+) |
| 适合谁 | 要成熟稳定的路由器固件 | 要可复现整机、认同声明式 | 要留用熟悉发行版 + 高性能分流 |
读这张表不是选"最好",是理解取舍:想开箱即用、生态成熟、跑在各种路由器硬件上 → OpenWRT;想整机可复现、配置即代码、原子回滚,愿意学 Nix → NixOS;想继续用熟悉发行版、要 eBPF 级性能和精细分流、能上较新内核 → Landscape。
更深的观察:三者的差异,本质是"系统边界画在哪"(整机 vs 一个守护进程)和"数据面用什么"(nftables vs eBPF)。理解这两维,任何新出现的路由器方案你都能快速归类。到这你该体会 Phase 3 的用意:3.1 证明"你懂路由器的本质"(三十行就是一台),3.2/3.3 让你看"同一个本质可以用不同哲学去工程化"(声明式 / eBPF 管理层)。你不再是某个系统的用户,而是理解了路由器本身,能评估、选择、甚至自己实现任何一种工程化路线。下一章 3.4 你会真正动手,在这样的系统上开发一个功能。
本章小结
- Landscape Router:Rust + eBPF 写的路由器管理平台,装在你现有发行版(Debian/Arch/openSUSE)上、不替换系统;是 OpenWRT(专用发行版)、NixOS(声明式整机)之外的第三种路线。
- 关键技术选择:用 eBPF(挂 TC/XDP 钩子)做数据面 NAT 和分流,而非 1.3 的 nftables——直连零开销、可编程、精细控制;证明 2.7"高级功能=原语组合"可换底座。
- 用框架读功能:精细 NAT(按流量选 NAT4/NAT1)↔0.6;按流 DNS↔2.3/2.7;流量重定向进 Docker 做 TProxy↔2.7/1.4;Geo 规则分流↔2.7。每个都对得上学过的概念。
- 它对持久化的答案:单目录集中配置 + 启动自动迁移 + 可降级(不同于 NixOS 的声明式不可变)。
- 三种路线差异的本质是"系统边界画在哪"(整机 vs 守护进程)和"数据面用什么"(nftables vs eBPF);理解这两维,能快速归类任何路由器方案。
动手练习
- 用一句话各自概括 OpenWRT、NixOS、Landscape 的核心哲学,再说出它们各自"最适合的人"。你会选哪个当自己的主路由?为什么?
- 解构练习:把 Landscape 的四个功能(精细 NAT、按流 DNS、TProxy 进容器、Geo 分流)各对到本课的一到两章。哪些是 2.7 的直接翻版?
- 思考题:Landscape 用 eBPF、OpenWRT 用 nftables 做数据面,各自优势和代价是什么?(eBPF:快、可编程,但要新内核、开发门槛高;nftables:成熟、通用、规则易读,但复杂分流的性能和灵活性受限。)
- 进阶(你在学 Rust):去 Landscape 仓库看它的 crate 划分(landscape-ebpf、landscape-dns、landscape-webserver…),对照本课——哪个 crate 对应你学的哪块功能?这是用 Rust 读真实网络项目的好机会。